Fiber (Effect)
Effectを実行したときに生成される実行単位
Effectを実行するたびにファイバーが生成される
特に並行してEffectを実行すると、それぞれに対応したファイバーが生成される
Effectの中断・待機・結果の取得などが可能
Fiber型
code:ts
Fiber<Success, Error>
成功時にSuccess型の値を返す
失敗時にError型のエラーを返す
Fiberの合成
Child Fiberのlifetime
4種類のfork方法がある
どれでforkするかで、lifecycleが変わる
子Fiberのライフサイクルは親に紐づく
つまり、親ファイバーが終了すると、子ファイバーも終了。
global scopeでのFork
親と無関係なデーモンファイバーを作成できる
つまり、グローバルスコープで実行され、アプリケーションが終了するまで継続される
code:ts
const parent = Effect.gen(function* () {
console.log("parent: started!")
yield* Effect.forkDaemon(daemon)
yield* Effect.sleep("3 seconds")
console.log("parent: finished!")
})
つまり、親とは独立だが、スコープが閉じられると終了する
特定スコープでのFork
つまり、より細かいライフサイクルの制御が可能
Fiberはいつ実行されるのか
Fiberは fork された直後に即実行されるとは限らず、現在のFiberの実行が終わるかyieldされるまで開始されないことがある
例:遅延実行によって一部の値しか取得されない
code:ts
import { Effect, SubscriptionRef, Stream, Console } from "effect"
const program = Effect.gen(function* () {
const ref = yield* SubscriptionRef.make(0)
yield* ref.changes.pipe(
Stream.tap((n) => Console.log(SubscriptionRef changed to ${n})),
Stream.runDrain,
Effect.fork
)
yield* SubscriptionRef.set(ref, 1)
yield* SubscriptionRef.set(ref, 2)
})
Effect.runFork(program)
code:ts
const program = Effect.gen(function* () {
const ref = yield* SubscriptionRef.make(0)
yield* ref.changes.pipe(
Stream.tap((n) => Console.log(SubscriptionRef changed to ${n})),
Stream.runDrain,
Effect.fork
)
yield* Effect.sleep("100 millis") // Fiber起動を待つ
yield* SubscriptionRef.set(ref, 1)
yield* SubscriptionRef.set(ref, 2)
})
Effect.runFork(program)
/*
出力:
SubscriptionRef changed to 0
SubscriptionRef changed to 1
SubscriptionRef changed to 2
*/
NotebookLM.icon
Fiber.ts: Effectの軽量な実行単位であるFiberを扱うための型と関数を提供します。並行処理や中断などの制御に不可欠です。
FiberHandle.ts: 実行中のFiberへのハンドルを表す型を提供します。
FiberId.ts: Fiberの一意な識別子を表す型を提供します。
FiberMap.ts: Fiberをキーとするマップ構造を提供します。
FiberRef.ts: Fiberに紐付けられた不変な値を管理するための仕組みを提供します。ロギングやトレーシングのコンテキスト情報をFiberごとに保持するのに役立ちます。
FiberRefs.ts: FiberRefのコレクションを管理するための型を提供します。
FiberRefsPatch.ts: FiberRefsへの変更を追跡するための型を提供します。
FiberSet.ts: Fiberの集合を管理するための型を提供します。
FiberStatus.ts: Fiberの現在の状態(実行中、中断、完了など)を表す型を提供します。